#ifndef SOCKET_H_
#define SOCKET_H_
#define BACKLOG 15
#define buf_len 100
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <string>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "errors.h"
#include <signal.h>
#include "./messages/message.h"

using namespace std;

class Socket {
private:
	int sockfd;
public:
	Socket();
	//Crea un objeto socket a partir de un fd existente
	Socket(int fd);

	//Constructor copia
	Socket(const Socket& s);

	~Socket();

	//Por si voy a escuchar, bindea mi ip a un puerto para escuchar
	int Bind(int port) const;
	//Intenta conectar a ip:port
	int Connect(const string* server_adress, int server_port) const;
	//Escucha por conexiones entrantes
	int Listen(int port) const;
	//Acepta conexion entrante, devuelve un nuevo socket para conversar
	Socket* Accept() const;
	//Envia datos
	int Send(const void* msg, unsigned int len) const;
	int Send(const string* msg) const;
	int Send(Message* msg) const;
	//Recibe datos
	int Recv(unsigned int size, string* total_received) const;
	//Cierra el socket
	int Close();
	//Apaga el socket
	int Shutdown(int opt);

};

#endif /* SOCKET_H_ */
